#include "LoCos.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"

EventLink_struct *LinkHeadptr=NULL;//不可在此时用malloc   为啥？我忘了
EventLink_struct *LinkRTptr=NULL;
EventParameter_struct **eventList=NULL;

void LocosListen(void){//实则是对链表进行遍历，实时性有点差   若对实时性要求高的，触发trigger标志位之后，直接调用exeDecide()函数
    /*监听触发事件*/
    EventLink_struct *TaskTempptr=LinkHeadptr->next;
    while(TaskTempptr!=NULL){
        TaskTempptr->event->triggerFun();
        /*会更新事件的trigger变量*/
        /*为了实时性，可在中断中监听*/
        exeDecide(TaskTempptr->event);
        TaskTempptr=TaskTempptr->next;
    }
}

char exeDecide(EventParameter_struct *event){//执行判决函数
    int i=0;
    taskcnt *ptr=NULL;
    if(event->trigger==Enable&&event->state==stop) {
        if(event->senior!=NULL){
            ptr=event->senior;
            /*判断 父执行级*/
            for(i=0;i<*(event->senior);i++){
                if(eventList[*(++ptr)]->state==running)
                    return 0;
            }
        }
        if(event->junior!=NULL){
            /*判断 子执行级*/
            ptr=event->junior;
            for(i=0;i<*(event->junior);i++){
                if(eventList[*(++ptr)]->state==running){
                    /*子执行级在运行，则关闭*/
                    eventList[*ptr]->exeFun(Disable);
                    event->state=stop;
                }
            }
        }
        /*运行 执行(exeFun即服务)函数*/
        event->exeFun(Enable);
        event->state=running;
        event->trigger=Disable;
        return 1;
    }
    return 0;
}
void triggerFunNull(void){

}
unsigned char RegisterTask(EventParameter_struct **event,void (*exeFun)(EnableType_enum sta),void (*triggerFun)(void),\
                           taskcnt ID,taskcnt *senior,taskcnt *junior) {
    //完成绑定操作(结构体中 执行函数与父子执行级)
    //分配位号 自行分配 （赋值触发状态机）,需要建立一个哈希映射 判断是否id唯一
    EventLink_struct *list=(EventLink_struct *)malloc(sizeof(EventLink_struct));//keil中，这个不能放下一句的后面，是因为keil编译器中 不能后声明
    *event=(EventParameter_struct *)malloc(sizeof(EventParameter_struct));
    eventList[ID]=*event;
    // triggerList[ID]=triggerFun;
    (*event)->exeFun=exeFun;
    (*event)->triggerFun=triggerFun;
    (*event)->ID=ID;
    (*event)->senior=senior;
    (*event)->junior=junior;
    (*event)->trigger=Enable;
    (*event)->state=stop;
    /*构建双向列表*/
    list->last=LinkRTptr;
    list->event=(*event);
    list->next=NULL;
    LinkRTptr->next=list;
    LinkRTptr=LinkRTptr->next;
    printf("event%d Registered!\n",ID);
    return 1;
}

void LocosInit(){
    LinkHeadptr=(EventLink_struct *)malloc(sizeof(EventLink_struct));
    LinkHeadptr->event=NULL;
    LinkHeadptr->last=NULL;
    eventList=(EventParameter_struct **)malloc(sizeof(EventParameter_struct *)*MAXTASKCNT);
    LinkRTptr=LinkHeadptr;
    printf("Init finish!\n");
}
// void AddRestrain() {


// }

// void EventMonitor() {


// }

// void CallbackFunction() {


// }
